/*************************************************************************
    > File Name    : DictProducer.h
    > Author       : LiuLei
    > Mail         : 2261459486@qq.com 
    > Created Time : 2022年11月29日 星期二 10时01分27秒
 ************************************************************************/

#ifndef __LL_DICTPRODUCER_H__
#define __LL_DICTPRODUCER_H__

#include "Configuration.h"
#include <vector>
#include <string>
#include <set>
#include <unordered_map>

using std::vector;
using std::string;
using std::set;
using std::unordered_map;
using std::pair;

class SplitTool;    //前向声明

class DictProducer
{
public:
    //DictProducer(Configuration & conf);
    DictProducer(Configuration & conf, SplitTool *splitTool, int flag);
    ~DictProducer();

    void buildEnDict();     //创建英文字典
    void buildCnDict();     //创建中文字典
    void buildIndex(const string &filepath);    //创建索引

    void storeDict(const string &filepath);     //将词典写入文件
    void storeIndex(const string &filepath);    //将索引写入文件

    void showFiles() const;     //查看文件路径，作为测试用
    void showDict() const;      //查看词典，作为测试用

private:
    void getFiles(string path, vector<string> &files);  //获取语料文件目录下所有文件的绝对路径
    string cleanUpWord(const string &word);             //针对英文单词大写转小写并过滤标点
    size_t getUtf8ByteNum(const char byte);             //获取utf-8编码下字符占据的字节数

private:
    Configuration                   & _conf;
    SplitTool                       *_splitTool;    //分词工具

    int                             _flag;          //创建中文词典还是英文词典

    vector<string>                  _files;         //语料库文件的绝对路径集合
    unordered_map<string,int>       _dict;          //利用哈希表加速创建词典库
    unordered_map<string,set<int>>  _index;         //字典索引,与词典文件行号对应
};

#endif
